-
Notifications
You must be signed in to change notification settings - Fork 2.4k
kmsdrm: Restore atomic support. #11511
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
I'm not sure we should get into the business of promising to crash the entire process if something goes wrong, by adding assert_always to this. |
Agreed. Gamers get very unhappy if they lose several hours progress without getting a chance to save. :) |
Tried this out on a raspberry pi, and it mostly works. Here's the current TODO list:
These are obviously important issues to resolve, but I was surprised that it was otherwise rendering stuff on the (almost) first attempt. More work to be done still, though. |
As you noted, we probably want to get the correct display data. If we have a window, you can use |
Setting |
9dc6c6e
to
ed93dde
Compare
Rebased this to remove conflicts; going to try to get this finished, finally. |
Latest pushes fix up the display data problems, and add a hint to use as an escape hatch to turn off the atomic support. This now works pretty well on my laptop! I need to test this on a television to see if the scaling issue is still a thing. I'll plug in an HDMI cable tonight and see what happens. |
Okay, scaling is fixed (it was actually that the merged code didn't change the vidmode at all in the atomic paths, due to a behavior that changed at some point in SDL). As far as I know, this is able to be merged now. It works here on both my laptop screen and an external HDMI monitor on the same device, both with and without atomic support. |
Have you tested OpenGL as well as Vulkan? Have you verified #4984 is fixed? |
OpenGL definitely works; I can't get Vulkan to work even without this PR for some reason. I'll see if a Raspberry Pi will do it, perhaps. |
I haven't yet, but the goal here was just to get the thing merged and working. I'll test this, too. |
33869a8
to
7713ecb
Compare
Okay, this needs a little more testing to verify Vulkan support and mouse input stuff, but the basic concerns are all resolved now. |
68748a5
to
ab674ee
Compare
Okay, so, some interesting findings:
SDL/src/video/kmsdrm/SDL_kmsdrmvulkan.c Line 318 in cbcb145
Which is to say it finds GPUs, but doesn't find displays attached to them...which it should, I assume. I don't know why it doesn't. I built this thing and ran it from the console, though: https://github.com/nyorain/kms-vulkan And it drew just fine through Vulkan...it doesn't make a call to vkGetPhysicalDeviceDisplayPropertiesKHR, so it's possible the solution is to just dump this bit of code altogether from our backend (why are we having Vulkan enumerate displays? Didn't we just do this anyhow with our own kmsdrm code?), but I haven't dug in further yet. But we shouldn't hold up this PR any further, at least for this specific issue. Also:
The non-atomic code path just puts garbage on the screen on a Pi5 for whatever reasons. The atomic path works just fine with testsprite, etc, though. Finally:
I'm just sitting here moving the mouse constantly during testsprite, and it doesn't seem to slow down at all (and the FPS reports every five seconds are consistent between runs where I leave it alone and runs where I don't). The atomic backend appears to be syncing to vblank by default (steady 60 fps), whereas non-atomic doesn't, which is either normal or something we should fix...but both the atomic and non-atomic versions in this PR, and main, don't suffer any framerate loss from mouse movement. So I might need a better test case than testsprite. @slouken, did you have something specific that was taking a hit on mouse movement we can try with this PR? |
This is an attempt to restore the ATOMIC support to the kmsdrm backend.
This was done by merging @vanfanel's final atomic work from SDL2 into the latest from SDL3. This wasn't a trivial effort, as a lot had changed in both kmsdrm specifically and SDL3 generally, so I expect there are issues to resolve in this PR still. It's at the "it compiles" stage; I'll be trying it on a Raspberry Pi 5 soon and fixing obvious issues that pop up.
There isn't a separate atomic and non-atomic version of the kmsdrm backend in this PR; it's now one codebase that will decide to use the atomic features if it can set the
DRM_CLIENT_CAP_ATOMIC
andDRM_CLIENT_CAP_UNIVERSAL_PLANES
client capabilities. If not, it'll use the "legacy" codepaths. Before merging, we should probably add an SDL hint to let people turn off atomic support even if the system would otherwise support it, as a failsafe.Note a few FIXMEs in this PR; these were pieces I couldn't decide how to correctly adapt, but I made a reasonable attempt anyhow.
Reference Issue #4984.